<?php

namespace Maestros\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Maestros\Model\Entity\Persona;
use Maestros\Controller\Service\GenericService;
use Maestros\Model\Dao\PersonaDAO;
use Maestros\Controller\Service\NacionalidadService;
use Maestros\Controller\Service\SexoService;
use Maestros\Controller\Service\EstadoCivilService;
use Maestros\Controller\Service\OcupacionService;

//SERVICIO
class PersonaService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $personaService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    /**
     * @param type $adapter
     * @return Instancia de PersonaService
     * Patron singleton
     */
    public static function getInstance($adapter) {
        if (self::$personaService == null) {
            self::$personaService = new PersonaService($adapter);
        }
        return self::$personaService;
    }

    public function getPersonaDao() {
        return PersonaDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type $id
     * @return type
     */
    public function getRegistro($id) {
        $data = null;
        $success = false;
        $persona = $this->obtenerPersonaSegunId($id);
        if ($persona->getId() != null) {
            $data[0] = $persona->objectToArray();
            $success = true;
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data)
        );
        return $output;
    }

    public function getRegistroCompleto($id) {
        $persona = $this->obtenerPersonaSegunId($id);
        return $this->armarRegistroCompleto($persona);
    }

    public function getRegistroSegunCedula($cedula) {
        $persona = $this->obtenerPersonaSegunCedula($cedula);
        return $this->armarRegistroCompleto($persona);
    }

    public function armarRegistroCompleto($persona) {
        $mensaje = 'CEDULA SIN REGISTRAR';
        $data = null;
        $success = false;
        $servicioNacionalidad = NacionalidadService::getInstance($this->dbAdapter);
        $nacionalidad = $servicioNacionalidad->obtenerNacionalidadSegunId($persona->getNacionalidad());
        $servicioSexo = SexoService::getInstance($this->dbAdapter);
        $sexo = $servicioSexo->obtenerSexoSegunId($persona->getSexo());
        $servicioEstadoCivil = EstadoCivilService::getInstance($this->dbAdapter);
        $estadoCivil = $servicioEstadoCivil->obtenerEstadoCivilSegunId($persona->getEstadoCivil());
        $servicioDiscapacidad = DiscapacidadService::getInstance($this->dbAdapter);
        $discapacidad = $servicioDiscapacidad->obtenerDiscapacidadSegunId($persona->getDiscapacidad());
        $servicioOcupacion = OcupacionService::getInstance($this->dbAdapter);
        $ocupacion = $servicioOcupacion->obtenerOcupacionSegunId($persona->getOcupacion());
        if ($persona->getId() != null) {
            $data[0] = $persona->objectToArray();
            $success = true;
            $data[0]['_nacionalidad'] = $nacionalidad->getDescripcion();
            $data[0]['_sexo'] = $sexo->getDescripcion();
            $data[0]['_estadoCivil'] = $estadoCivil->getDescripcion();
            $data[0]['_discapacidad'] = $discapacidad->getDescripcion();
            $data[0]['_ocupacion'] = $ocupacion->getDescripcion();
            $mensaje = 'CEDULA ENCONTRADA';
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data),
            'mensaje' => $mensaje
        );
        return $output;
    }

//------Retornan los objetos-------

    /**
     * Dado la cedula del persona se trae el registro asociado de la tabla persona
     * @param $cedula type string
     * @return Objeto Persona
     */
    public function obtenerPersonaSegunCedula($cedula) {
        $registros = $this->getPersonaDao()->getPersonaSegunCedula($cedula);
        $data = UtilsArrayController::llenarData($registros);
        $persona = new Persona($data[0]);
        $persona->setEstadoCivil($data[0]['id_estado_civil']);
        $persona->setFechaNacimiento($data[0]['fecha_nacimiento']);
        $persona->setOtroOrganismo($data[0]['otro_organismo']);
        $persona->setStatusModificacion($data[0]['id_status_modificacion']);
        return $persona;
    }

    /**
     * Dado el id de la persona se trae el registro asociado de la tabla persona
     * convirtiendo el primero en un objeto, luego lo retorna
     * @param $id type int
     * @return Objeto Persona
     */
    public function obtenerPersonaSegunId($id) {
        $registros = $this->getPersonaDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $persona = new Persona($data[0]);
        $persona->setEstadoCivil($data[0]['id_estado_civil']);
        $persona->setFechaNacimiento($data[0]['fecha_nacimiento']);
        $persona->setOtroOrganismo($data[0]['otro_organismo']);
        $persona->setStatusModificacion($data[0]['id_status_modificacion']);
        return $persona;
    }

}
